/*
 * VCNL36825T_Application_Library.c
 *
 * Created  : 13 April 2021
 * Modified : 3 May 2021
 * Author   : HWanyusof
 * Version	: 1.0
 */

#include "VCNL36825T_Prototypes.h"
#include "VCNL36825T.h"
#include "I2C_Functions.h"
#include "VCNL36825T_Application_Library.h"
#include <math.h>
#include <string.h>

extern int I2C_Bus;

//****************************************************************************************************
//***************************************Application API**********************************************

/*Get Proximity Mode
 *returns the PS mode status of the sensor as follows:
 *
 * 0 - PS Shutdown Mode
 * 1 - Auto/Self-Timed Mode
 * 2 - Active Force Mode/Continuous Forced Mode
 * 3 - Low Power Mode
 * 4 - Auto Calibration Mode
 *
 */
int VCNL36825T_GET_PS_Mode()
{
	int Mode;

	//Read the PS_ON bit: Mode = 0 - PS Shutdown
	if (VCNL36825T_GET_PS_ON_Bit() == 0b0) Mode = 0;

	//Read the PS_AF bit and PS_ON: Mode = 1 - Auto/Self-Timed Mode
	if ((VCNL36825T_GET_PS_AF_Bit() == 0b0) && (VCNL36825T_GET_PS_ON_Bit() == 0b1)) Mode = 1;

	//Read the PS_AF bit: Mode = 2 - AF Mode
	if (VCNL36825T_GET_PS_AF_Bit() == 0b1) Mode = 2;

	//Read the PS_LPEN bit: Mode = 3 - Low Power Mode
	if ((VCNL36825T_GET_PS_LPEN_Bit() == 0b1) && (VCNL36825T_GET_PS_ON_Bit() == 0b1)) Mode = 3;

    //Read the PS_AF and PS_AC bit: Mode = 4 - Auto Calibration Mode
	if ((VCNL36825T_GET_PS_AF_Bit() == 0b1) && (VCNL36825T_GET_PS_AC_Bit() == 0b1)) Mode = 4;

	return Mode;
}

/*Get delay for auto calibration mode
 *This delay depends on the AC_Period and Auto Calibration Number of Measurement
 *For Example PS_AC_PERIOD = 3ms and PS_AC_NUM = 8 -> (3ms * 8) + tolorance ≈ 30ms
 *returns the delay as PS_AC_PERIOD * PS_AC_NUM + 6ms tolerance
 *
 */
int VCNL36825T_GET_DELAY_PS_AC()
{
	int Delay;

	//Read the PS_AC_PERIOD bit and PS_AC_NUM bit and determine the delay
	if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 0) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 0)) Delay = 10;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 0) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 1)) Delay = 12;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 0) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 2)) Delay = 18;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 0) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 3)) Delay = 30;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 1) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 0)) Delay = 12;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 1) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 1)) Delay = 18;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 1) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 2)) Delay = 30;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 1) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 3)) Delay = 54;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 2) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 0)) Delay = 18;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 2) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 1)) Delay = 30;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 2) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 2)) Delay = 54;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 2) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 3)) Delay = 102;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 3) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 0)) Delay = 30;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 3) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 1)) Delay = 54;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 3) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 2)) Delay = 102;
    if ((VCNL36825T_GET_PS_AC_PERIOD_Bit() == 3) && (VCNL36825T_GET_PS_AC_NUM_Bit() == 3)) Delay = 198;

	return Delay;
}

//Print Auto Calibration Interrupt status
void Print_PS_AC_INT_STATUS()
{
    Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

    HAL_Delay(400);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

    //Print the Reg 0xFB (PS_AC_DATA_STATUS)
	value = VCNL36825T_GET_PS_AC_DATA_STATUS();
	sprintf(TransmitBuffer,">>>>>>>Reg 0xFB (PS_AC_DATA_STATUS) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Interrupt Flag
	value = VCNL36825T_GET_PS_AC_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>PS_AC Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Reset the Sensor to the default value
void Reset_Sensor()
{
	struct TransferData VCNL36825T_Data;
	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF1_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x01;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF2_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x01;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF3_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x00;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_THDL;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x00;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_THDH;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x00;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

	VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CANC;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x00;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);

    VCNL36825T_Data.Slave_Address = VCNL36825T_SlaveAddress;
	VCNL36825T_Data.RegisterAddress = VCNL36825T_PS_CONF4_L;
	VCNL36825T_Data.Select_I2C_Bus = I2C_Bus;
	VCNL36825T_Data.WData[0] = 0x00;
	VCNL36825T_Data.WData[1] = 0x00;
	WriteI2C_Bus(&VCNL36825T_Data);
}

/*Print all of the Register Value
 *Print_All()
 *
 */
void Print_All()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print PS Mode
	switch(VCNL36825T_GET_PS_Mode())
	{
		case 0 :	sprintf(TransmitBuffer2,">>>>>>>Mode : PS Off/Shutdown \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 1 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Auto/Self-Timed Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 2 :	sprintf(TransmitBuffer2,">>>>>>>Mode : AF/Continuous Forced Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 3 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Low Power Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 4 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Auto Calibration Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
	}

    HAL_Delay(50);

	sprintf(TransmitBuffer2,">>>>>>>>>>>>>>>>>>>>>>>>PS<<<<<<<<<<<<<<<<<<<<<<<<< \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Reg 0x00 (VCNL36825T_PS_CONF1_L and VCNL36825T_PS_CONF1_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF1_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x00 (PS_CONF1) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x03 (VCNL36825T_PS_CONF2_L and VCNL36825T_PS_CONF2_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF2_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x03 (PS_CONF2) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x04 (VCNL36825T_PS_CONF3_L and VCNL36825T_PS_CONF3_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF3_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x04 (PS_CONF3) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x05 (PS_THDL)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_THDL);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x05 (PS_THDL) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x06 (PS_THDH)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_THDH);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x06 (PS_THDH) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Reg 0x07 (PS_CANC)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CANC);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x07 (PS_CANC) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Reg 0x08 (VCNL36825T_PS_CONF4_L and VCNL36825T_PS_CONF4_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF4_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x08 (PS_CONF4) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Reg 0xFB (PS_AC_DATA)
    if(VCNL36825T_GET_PS_Mode() == 4)
    {
    	value = VCNL36825T_GET_PS_AC_DATA();
		sprintf(TransmitBuffer,">>>>>>>Reg 0xFB (PS_AC_DATA) Val : %d Counts \r\n",value);
		CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
    	HAL_Delay(50);
    }

	//Set Trigger for AF and Auto Calibration Mode + Associated delay
	if((VCNL36825T_GET_PS_Mode() == 2) || (VCNL36825T_GET_PS_Mode() == 4))
	{
		//Set trigger to start a measurement
		VCNL36825T_SET_PS_TRIG(VCNL36825T_PS_TRIG_EN);

		//Delay of PS Measurement + other Circuit Delay
		HAL_Delay(50);
	}

	//Delay for Auto and Low Power Mode + Associated delay
	if((VCNL36825T_GET_PS_Mode() == 1) || (VCNL36825T_GET_PS_Mode() == 3))
	{
		//Delay of PS Measurement + other Circuit Delay
		HAL_Delay(50);
	}

	//Print the Proximity Data
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_DATA);
	sprintf(TransmitBuffer,">>>>>>>Proximity Data : %d Counts<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Interrupt Flag
	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Interrupt Flag
	value = VCNL36825T_GET_PS_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Print the output of the Auto Mode/Self-Timed Mode
void Print_Auto_Mode()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************Auto/Self-Timed Mode Mode************* \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	//Delay of PS Measurement + other Circuit Delay
	HAL_Delay(50);

	//Print the Proximity Data
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_DATA);
	sprintf(TransmitBuffer,">>>>>>>Proximity Data : %d Counts<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Interrupt Flag
	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Interrupt Flag
	value = VCNL36825T_GET_PS_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Print the output of the Active Force Mode/Continuous Forced Mode
void Print_AF_Mode()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************AF/Continuous Forced Mode************* \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	//Set trigger to start a measurement
	VCNL36825T_SET_PS_TRIG(VCNL36825T_PS_TRIG_EN);

	//Delay of PS Measurement + other Circuit Delay
	HAL_Delay(50);

	//Print the Proximity Data
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_DATA);
	sprintf(TransmitBuffer,">>>>>>>Proximity Data : %d Counts<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Interrupt Flag
	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Interrupt Flag
	value = VCNL36825T_GET_PS_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Print the output of the Low Power Mode
void Print_Low_Power_Mode()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*******************Low Power Mode****************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	//Delay of PS Measurement + other Circuit Delay
	HAL_Delay(50);

	//Print the Proximity Data
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_DATA);
	sprintf(TransmitBuffer,">>>>>>>Proximity Data : %d Counts<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Interrupt Flag
	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Interrupt Flag
	value = VCNL36825T_GET_PS_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Print the output of the Auto Calibration Mode
void Print_Auto_Calibration_Mode()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************Auto Calibration Mode************* \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	//Set trigger to start a measurement
	VCNL36825T_SET_PS_TRIG(VCNL36825T_PS_TRIG_EN);

	//Delay of PS Measurement + other Circuit Delay
	HAL_Delay(50);

	//Print the Proximity Data
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_DATA);

	sprintf(TransmitBuffer,">>>>>>>Proximity Data : %d Counts<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Interrupt Flag
	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Interrupt Flag
	value = VCNL36825T_GET_PS_INT_FLAG();
	sprintf(TransmitBuffer,">>>>>>>Interrupt Flag : 0x%x<<<<<<<< \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

//Print the Register Value
void Print_Register_Settings()
{
	Word value;

	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*****************Register Settings***************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print PS Mode
	switch(VCNL36825T_GET_PS_Mode())
	{
		case 0 :	sprintf(TransmitBuffer2,">>>>>>>Mode : PS Off/Shutdown \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 1 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Auto/Self-Timed Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 2 :	sprintf(TransmitBuffer2,">>>>>>>Mode : AF/Continuous Forced Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 3 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Low Power Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
		case 4 :	sprintf(TransmitBuffer2,">>>>>>>Mode : Auto Calibration Mode \r\n");
					CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
					break;
	}
    HAL_Delay(50);

	sprintf(TransmitBuffer2,">>>>>>>>>>>>>>>>>>>>>>>>PS<<<<<<<<<<<<<<<<<<<<<<<<< \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	//Print the Reg 0x00 (VCNL36825T_PS_CONF1_L and VCNL36825T_PS_CONF1_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF1_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x00 (PS_CONF1) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x03 (VCNL36825T_PS_CONF2_L and VCNL36825T_PS_CONF2_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF2_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x03 (PS_CONF2) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x04 (VCNL36825T_PS_CONF3_L and VCNL36825T_PS_CONF3_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF3_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x04 (PS_CONF3) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x05 (PS_THDL)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_THDL);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x05 (PS_THDL) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	//Print the Reg 0x06 (PS_THDH)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_THDH);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x06 (PS_THDH) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Reg 0x07 (PS_CANC)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CANC);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x07 (PS_CANC) Val : %d Counts \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

    //Print the Reg 0x08 (VCNL36825T_PS_CONF4_L and VCNL36825T_PS_CONF4_H)
	value = VCNL36825T_READ_Reg(VCNL36825T_PS_CONF4_L);
	sprintf(TransmitBuffer,">>>>>>>Reg 0x08 (PS_CONF4) Val : 0x%x \r\n",value);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer2," \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

/*Print the variable in DEC for debugging
 *Print_Variable_DEC(Word Var)
 *Word Var - Input Parameter:
 *
 * Value between 0d0 and 0d65535
 */
void Print_Variable_DEC(Word Var)
{
	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer,">>>>>>>Variable : 0d%d  \r\n",Var);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

/*Print the variable in HEX for debugging
 *Print_Variable_HEX(Word Var)
 *Word Var - Input Parameter:
 *
 * Value between 0d0 and 0d65535
 */
void Print_Variable_HEX(Word Var)
{
	#define TRANSMIT_BUFFER_SIZE  128
	char   TransmitBuffer[TRANSMIT_BUFFER_SIZE];
	char   TransmitBuffer2[TRANSMIT_BUFFER_SIZE];

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));
	HAL_Delay(50);

	sprintf(TransmitBuffer,">>>>>>>Variable : 0x%x  \r\n",Var);
	CDC_Transmit_FS(TransmitBuffer,strlen(TransmitBuffer));
	HAL_Delay(50);

	sprintf(TransmitBuffer2,"*************************************************** \r\n");
	CDC_Transmit_FS(TransmitBuffer2,strlen(TransmitBuffer2));

	HAL_Delay(2000);
}

/*Reverses a string 'str' of length 'len'
 *reverse(char* str, int len)
 *char* str - Array pointer to be reversed
 *int len - Length of the array
 */
void reverse(char* str, int len)
{
    int i = 0, j = len - 1, temp;
    while (i < j) {
        temp = str[i];
        str[i] = str[j];
        str[j] = temp;
        i++;
        j--;
    }
}

/*Converts a given integer x to string str[].
 *intToStr(int x, char str[], int d)
 *int x - floating-point number to be converted to a string (Both the integer part as well as fraction/decimal point part)
 *char str[] - output string of the floating-point number in the form of array character
 *int d - number of decimal point (the integer part always = 0, the fraction/decimal point part = int afterpoint from ftoa() input)
 */
int intToStr(int x, char str[], int d)
{
    int i = 0;

    while (x)
	{
		//Store and convert int to char (Valid for single digit)
        str[i++] = (x % 10) + '0';
        x = x / 10;
    }

    //If number of digits required is more, then
    //add 0s at the beginning
    while (i < d) str[i++] = '0';

	//Reverse the string characters in the array str
    reverse(str, i);

	//Place the null character at the end of the array
    str[i] = '\0';

	//Return the position i
    return i;
}

/*Converts a floating-point/double number to string.
 *ftoa(float n, char* res, int afterpoint)
 *float n - floating-point number to be converted to a string
 *char* res - pointer to output string of the floating-point number in the form of array character
 *int d - number of decimal point
 */
void ftoa(float n, char* res, int afterpoint)
{
    //Extract integer part
    int ipart = (int)n;

    //Extract decimal part
    float fpart = n - (float)ipart;

    //Convert integer part to string and the function returns the position after the interger
    int i = intToStr(ipart, res, 0);

    //Check for display option after point
    if (afterpoint != 0)
	{
		//Add dot after the integer part
        res[i] = '.';

        //Multiply decimal part by 10^decimal point
        fpart = fpart* pow(10, afterpoint);

		//Convert decimal part to string
        intToStr((int)fpart, res + i + 1, afterpoint);
    }
}
